home *** CD-ROM | disk | FTP | other *** search
/ Cracking 2 / Cracking II..iso / Texty / crackme / id6-lu48-fr.txt < prev    next >
Encoding:
Text File  |  1999-06-19  |  11.9 KB  |  261 lines

  1.  
  2.             -----------------------------------
  3.              Immortal Descendants CrackMe 6.0
  4.                       (par TORN@DO)
  5.             Tutorial de Lucifer48, 18 juin 1999
  6.             -----------------------------------
  7.  
  8.  
  9. =====================
  10. 1. APPROCHE THEORIQUE
  11. =====================
  12.  
  13. On observant attentivement la structure de l'exe on dΘcouvre plusieurs choses.
  14. PremiΦre observation: il y a six segments 'suspects': .CRYP, .ID60, http://L, EARN2CR, RK.CBJ., NET.
  15. Les quatre segments .CRYP, http://L, EARN2CR, RK.CBJ. ont mΩme taille (remarque: τa me fait penser
  16. α l'enpacketage de 'idcrkme40', avec plusieurs segments nommΘs .Stone)
  17. Premiere certitute: le crackme est packΘ plusieurs fois avec un mΩme packer (appellons le
  18. PACKER #2). Ce packer rajoute un nouveau segment α la fin de l'exe qui contient les informations
  19. nΘcessaires pour le dΘcompactage (comme pour Stone's PE Encrypter 1.13 dans idcrkme40.exe).
  20. DeuxiΦme observation: .ID60 et NET ont mΩme taille (Phys size & Virt size), apparament un autre
  21. packer (appellons le PACKER #1), utilisΘ α deux reprises.
  22. TroisiΦme observation: entrypoint: RVA: 00019319h
  23. Le "319", τa vous dit rien ???? Ne serait-ce pas la taille d'un segment packΘ via PACKER #2.
  24. On y voit plus clair: le PACKER #1 se recopie α la fin du dernier segment (augmente la taille),
  25. et crypte l'exe (nous allons voir o∙ et comment aprΦs).
  26.  
  27. Finalement: on a le schΘma suivant:
  28.   exe initial (unpacked)
  29. + crypte 2 fois avec PACKER #2
  30. + crypte 1 fois avec PACKER #1
  31. + crypte 4 fois avec PACKER #2
  32. + crypte 1 fois avec PACKER #1
  33. ------------------------------
  34. = idcrkme60.exe
  35.  
  36.  
  37. =====================
  38. 2. ETUDE DU PACKER #1
  39. =====================
  40.  
  41. On charge le crackme avec le symbol loader, EAX=00419319, c'est le dΘbut (la premiΦre instrcution)
  42. (entrypoint en anglais).
  43.  
  44. XXXX:00419319  PUSHFD                           ;sauvegarde des flags dans la pile (occupe 32 bits)
  45. XXXX:0041931A  PUSH EBP
  46. XXXX:0041931B  CALL 0041940C                    ;pas interessant (call trΦs court)
  47. XXXX:00419320  XCHG EDX,EBP
  48. XXXX:00419322  POP  EBP
  49. XXXX:00419323  PUSHAD                           ;sauvegarde des registres
  50. XXXX:00419324  XCHG EDX,EBP                     ;ebp=00016CFE
  51. XXXX:00419326  CMP  BYTE PTR [EBP+00412715],01
  52. XXXX:0041932D  JZ   00419368                    ;(no jump)
  53. XXXX:0041932F  MOV  BYTE PTR [EBP+00402715],01
  54. XXXX:00419336  JMP  0041941F
  55.  
  56. on continue:
  57.  
  58. XXXX:0041941F  CALL 0041943F
  59. XXXX:00419424  MOV  ESP,[ESP+08]
  60. XXXX:00419428  CALL 0041940C                    ;pas interessant (call trΦs court)
  61. XXXX:0041942D  MOV  BYTE PTR [EBP+004026CC],C3
  62. XXXX:00419434  CALL 00419384                    ;ICI, call α explorer absolument!! (*)
  63. XXXX:00419439  JMP  00419354
  64.  
  65. (*) Ce call est incontournable, puisque c'est ici prΘcisΘment que se passe le dΘcompatage/dΘcrytage
  66. des diffΘrents segments du programme.
  67.  
  68. XXXX:00419384  LEA  EDI,[EBP+004026CD]         ;offset RVA (c'est un "tableau" de plusieurs RVA)
  69. XXXX:0041938A  MOV  ESI,[EDI]                  ;RVA        (voir remarque)
  70. XXXX:0041938C  OR   ESI,ESI                    ;si ESI=0 on a tout fini de dΘcompacter
  71. XXXX:0041938E  JZ   004193C1
  72. XXXX:00419390  ADD  ESI,[EBP+0040270D]         ;ajoute l'image base (00400000)
  73. XXXX:00419396  MOV  ECX,[EDI+04]               ;taille de la zone α unpacker (Phys size)
  74. XXXX:00419399  PUSH EDI
  75. XXXX:0041939A  MOV  EDI,ESI
  76. ...
  77. dΘcompacte 32 bits par 32 bits (ADD / XOR / ROR / SUB)
  78. ...
  79. XXXX:004193B5  STOSD                           ;<=> MOV [EDI],EAX / ADD EDI,4
  80. XXXX:004193B6  SUB  ECX,04
  81. XXXX:004193B9  JAE  004193A6                   ;tant que ecx n'est pas nul, on continue
  82. XXXX:004193BB  POP  EDI
  83. XXXX:004193BC  ADD  EDI,08                     ;on va dΘcompacter la zone suivante
  84. XXXX:004193BF  JMP  0041938A                   ;retour, ci dessus
  85. XXXX:004193C1  RET                             ;fin du call 00419384
  86.  
  87. Remarque:
  88. -----IDCRKME60!NET+03C2---------------------------byte--------------PROT---(0)--
  89. XXXX:004193C2 00 10 00 00 08 0A 00 00-00 40 00 00 10 03 00 00  .........@......
  90. XXXX:004193D2 00 30 01 00 19 03 00 00-00 40 01 00 00 06 00 00  .0.......@......
  91. XXXX:004193E2 00 60 01 00 19 03 00 00-00 70 01 00 19 03 00 00  ..`......p......
  92. XXXX:004193F2 00 00 00 00                                      ....
  93. ---------------------------------------------------------------------------------
  94.  
  95. On retrouve les tailles (Phys size) et les adresses des differents segments, qui sont tour α
  96. tour dΘcompactΘs. Peut-Ωtre qu'un tableau sera plus clair:
  97.  
  98. RVA       Phys size    Name
  99. 00401000    A08        .text           ;premiΦre boucle
  100. 00404000    310        .data           ;seconde boucle
  101. 00413000    319        .CRYP           ;troisiΦme boucle
  102. 00414000    600        .ID60           ;quatriΦme boucle
  103. 00416000    319        http://L        ;cinquiΦme boucle
  104. 00417000    319        EARN2CR         ;sixiΦme boucle
  105.  
  106. on a arrive α la fin du packer (fin assez classique):
  107.  
  108. XXXX:00419374  POPAD                           ;restaure tous les registres
  109. XXXX:00419375  POPFD                           ;restaure tous les flags
  110. XXXX:00419376  MOV  EBX,[EDX+00402709]         ;EBX=00419000 (segment NET)
  111. XXXX:0041937C  MOV  [EDX+00402709],ECX
  112. XXXX:00419382  JMP  EBX                        ;fin de PACKER #1
  113.  
  114. Tout ce passe donc comme prΘvu, le PACKER #1, a fait son travail et il passe donc la main au
  115. PACKER #2.
  116.  
  117.  
  118. =====================
  119. 3. ETUDE DU PACKER #2
  120. =====================
  121.  
  122. Il dΘbute de la sorte:
  123.  
  124. XXXX:00419000  PUSH EBP
  125. XXXX:00419001  PUSH EDI
  126. XXXX:00419002  PUSH ESI
  127. XXXX:00419003  PUSH EDX
  128. XXXX:00419004  PUSH ECX
  129. XXXX:00419005  PUSH EBX
  130. XXXX:00419006  CALL 0041900B
  131. XXXX:0041900B  POP EBP                            ;bonne astuce pour rΘcupΘrer l'adresse
  132.  
  133. on continue:
  134.  
  135. XXXX:00419025  CALL 004190C3
  136. XXXX:0041902A  CMP  DWORD PTR [EBP+0040378F],00   ;nous avons [EBP+0040378F]=0 
  137. XXXX:00419031  JZ   0041907F                      ;jmp = quitte le programme, pas de dΘcompactage
  138. XXXX:00419033  SUB  EDX,[EBP+00403655]
  139. XXXX:00419039  SUB  EDX,0B
  140. XXXX:0041903C  MOV  [EBP+0040365D],EDX            ;sauvegarde l'image base (ici: 00400000)
  141. XXXX:00419042  MOV  ESI,004037B7                  ;petit buffer de 8*32 bits
  142. XXXX:00419047  ADD  ESI,EBP                       ;buffer situΘ dans le segment courant (NET)
  143. XXXX:00419049  PUSH ESI
  144. XXXX:0041904A  CALL [EBP+00403793]                ;CALL [KERNEL32!GetLocalTime]
  145. XXXX:00419050  CMP  WORD PTR [EBP+004037B9],01    ;mois
  146. XXXX:00419058  JB   0041908B                      ;saut vers la routine de dΘcompactage
  147. XXXX:0041905A  CMP  WORD PTR [EBP+004037B7],07D0  ;annΘe
  148. XXXX:00419063  JB   0041908B                      ;saut vers la routine de dΘcompactage
  149. XXXX:00419065  MOV  EAX,00403769
  150. XXXX:0041906A  ADD  EAX,EBP                       ;d EAX: "Ding Boy's PE-lockv0.07    1999-2000"
  151. XXXX:0041906C  MOV  EBX,004037F9
  152. XXXX:00419071  ADD  EBX,EBP                       ;d EBX: "  " (deux espaces)
  153. XXXX:00419073  PUSH 00                            ;MB_OK
  154. XXXX:00419075  PUSH EAX                           ;offset texte
  155. XXXX:00419076  PUSH EBX                           ;offset titre
  156. XXXX:00419077  PUSH 00                            ;pas de handle
  157. XXXX:00419079  CALL [EBP+0040378F]                ;CALL [USER32!MessageBoxA]
  158. XXXX:0041907F  MOV  EAX,FFFFFFFF                  ;quitte prΘmaturΘment le programme
  159.  
  160. Quelques explications: le call 004190C3, sert α initialiser les adresses systΦmes, en effet,
  161. PACKER #2, peut avoir α utiliser CALL [KERNEL32!GetLocalTime] et CALL [USER32!MessageBoxA],
  162. et c'est le r⌠le du call 004190C3 de trouver ces adresses. Trois cas sont possibles:
  163. * tout ce passe bien, on a trouvΘ les adresses => on saute vers la procΘdure de dΘcompactage
  164. * Nous sommes en l'an 2000, on recoit une messagebox, le dΘcompactage n'a pas lieu.
  165. * Pour une raison inconnue, PACKER #2 n'a pas rΘussi α trouver les adresses, lα encore le
  166.   dΘcompactage n'a pas lieu.
  167.  
  168.  
  169. Dans notre cas, c'est la derniΦre proposition, le programme quitte. Mais nous, on veut
  170. dΘcompacter l'exe, donc on va passer α travers le JZ 0041907F, allez jusqu'en XXXX:00419042
  171. et faire dans soft-ice r eip=0041908B, pour sauter dans la routine de dΘcompactage.
  172. Remarque: evidement, il ne faut pas tenter d'executer les call qui appellent l'api, car on
  173. obtiendrait immΘdiatement une GPF (General Protection Fault).
  174.  
  175. Voilα la procΘdure de "dΘcompactage"
  176.  
  177. XXXX:00419092  CMP  DWORD PTR [ESI],00            ;y'a-t-il encore un segment α dΘcompacter ?
  178. XXXX:00419095  JZ   004190AD                      ;si oui => (no jump)
  179. XXXX:00419097  MOV  EBX,[EBP+0040365D]            ;00400000
  180. XXXX:0041909D  ADD  EBX,[ESI]
  181. XXXX:0041909F  MOV  ECX,[ESI+04]                  ;taille de la zone
  182. XXXX:004190A2  SUB  BYTE PTR [EBX],01             ;"dΘcompactage": trΦs trΦs simple!
  183. XXXX:004190A5  INC  EBX                           ;on y a va octet par octet
  184. XXXX:004190A6  LOOP 004190A2                      ;boucle
  185. XXXX:004190A8  ADD  ESI,08                        ;[ESI+0]: RVA, [ESI+4]: size
  186. XXXX:004190AB  JMP  00419092                      ;boucle
  187. XXXX:004190AD  MOV  EAX,[EBP+00403659]            ;00018000
  188. XXXX:004190B3  MOV  EBX,[EBP+0040365D]            ;00400000
  189. XXXX:004190B9  ADD  EAX,EBX                       ;00418000 (RK.CJB.)
  190. XXXX:004190BB  POP  EBX
  191. XXXX:004190BC  POP  ECX
  192. XXXX:004190BD  POP  EDX
  193. XXXX:004190BE  POP  ESI
  194. XXXX:004190BF  POP  EDI
  195. XXXX:004190C0  POP  EBP
  196. XXXX:004190C1  JMP  EAX                           ;fin de PACKER #2
  197.  
  198. La procedure de dΘcompactage est trΦs simple...
  199.  
  200.  
  201. =================
  202. 4. PHASE PRATIQUE
  203. =================
  204.  
  205. Il est maintenant temps de dΘcompacter le crackme.
  206.  
  207.  Debut         Fin         Segment      Owner               Segments dΘcompactΘs
  208. 00419319  *  00419382  *  NET       *  PACKER #1  *  .text .data .CRYP .ID60 http://L EARN2CR
  209. 00419000  *  004190C1  *  NET       *  PACKER #2  *  .text .data
  210. 00418000  *  004180C1  *  RK.CJB.   *  PACKER #2  *  .text .data
  211. 00417000  *  004170C1  *  EARN2CR   *  PACKER #2  *  .text .data
  212. 00416000  *  004160C1  *  http://L  *  PACKER #2  *  .text .data
  213. 00414319  *  00414382  *  .ID60     *  PACKER #1  *  .text .data .CRYP .ID60
  214. 00414000  *  004140C1  *  .ID60     *  PACKER #2  *  .text .data
  215. 00413000  *  004130C1  *  .CRYP     *  PACKER #2  *  .text .data
  216. 004011CB  <--- dΘvinez ce que c'est!!!
  217.  
  218. Quand vous arrivez α la fin de la derniere procΘdure de dΘcompactage (XXXX:004130C1 JMP EAX);
  219. n'oubliez pas de dumper le processus.... (sous soft-ice, tapez A puis JMP EIP afin de mettre
  220. le programme dans une boucle infinie, appuyer sur F5, et lancer Procdump).
  221.  
  222. N'oublier pas de changer l'entrypoint (11CB) dans l'exe. Le crackme est dΘcompactΘ!!!!!
  223.  
  224.  
  225. ================================
  226. 5. RE-ENABLER LE BOUTTON REQUEST
  227. ================================
  228.  
  229. Les fenΩtres sont crΘΘes avec l'appel α "DialogBoxParamA", donc il faut jeter un coup d'oeuil
  230. du c⌠te de la "dialog box procedure", juste avant la vΘrification si on a clicke sur un boutton
  231. (message WM_COMMAND = 0111h), on voit un autre message: WM_INITDIALOG (= 0110h) qui comme son
  232. nom l'indique... on appercoit donc l'appel α EnableWindow, mais un peu avant, il y a ceci:
  233.  
  234. :004012E9 837DFC00                cmp dword ptr [ebp-04], 00000000
  235. :004012ED 7515                    jne 00401304
  236.  
  237. si [ebp-04]=0 alors le programme disable le boutton (de la fenΩtre principale).
  238. Donc changer JNE => JMP
  239. Un peu plus loin:
  240.  
  241. :00401379 837DFC00                cmp dword ptr [ebp-04], 00000000
  242. :0040137D 751C                    jne 0040139B
  243.  
  244. mΩme chose, ici! 
  245.  
  246. Remarque: si vous ne changer que le premier JNE, alors le boutton apparaitra bien enablΘ mais
  247. n'activera rien du tout, la creation de la boεte de dialogue "Request" ne se fera pas.
  248.  
  249.  
  250. =============
  251. 6. CONCLUSION
  252. =============
  253.  
  254. Voilα pour ce crackme! Que dire de plus...
  255. Greetings: TORN@DO (of course, for his crackme), Volatility (will we work together ?),
  256.            Eternal Bliss (for his site), MiZ (what a good essay for idcrkme5.0), ACiD BuRN,
  257.            and others people i forgot.
  258.  
  259.  
  260. Lucifer48
  261.